        // 预定义通用参数
        let param_header_token = {
                name: 'Authorization',
                required: true,
                dataType: 'string',
                comment: '登录认证头部信息',
                default: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCIwIjoiaHR0cDpcL1wvd3d3LnBvd2Vyc2RrLmNuIiwiYXVkIjoiIiwiaWF0IjoxNjAyNTg4MjIzLCJuYmYiOjE2MDI2MjQyMjMsInVzZXJfaWQiOjF9.ZkFUaD3Kgl_bQAEkBoYDJ31PQsXRPHa1gBeJWottMYY',
                pickerData: [{
                    value: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCIwIjoiaHR0cDpcL1wvd3d3LnBvd2Vyc2RrLmNuIiwiYXVkIjoiIiwiaWF0IjoxNjAyNTg4MjIzLCJuYmYiOjE2MDI2MjQyMjMsInVzZXJfaWQiOjF9.ZkFUaD3Kgl_bQAEkBoYDJ31PQsXRPHa1gBeJWottMYY',
                    text: 'user-1'
                }, {
                    value: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCIwIjoiaHR0cDpcL1wvbWFsbDIucHMiLCJhdWQiOiIiLCJpYXQiOjE2MTkwODE5NzQsIm5iZiI6MTYxOTExNzk3NCwidXNlcl9pZCI6Mn0.BHVPMR_pD57vCKmjYvE_yQE8sHbJm5vybGRgsVfRHp0',
                    text: 'user-2'
                }, {
                    value: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCIwIjoiaHR0cDpcL1wvbWFsbDIucHMiLCJhdWQiOiIiLCJpYXQiOjE2MTkwODIwNDUsIm5iZiI6MTYxOTExODA0NSwidXNlcl9pZCI6M30.e85J_n-KuSkVFSfbYLnxY93__dqEYihfnzf0oAvKvE0',
                    text: 'user-3'
                }, {
                    value: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCIwIjoiaHR0cDpcL1wvbWFsbDIucHMiLCJhdWQiOiIiLCJpYXQiOjE2MTkwODIwNzcsIm5iZiI6MTYxOTExODA3NywidXNlcl9pZCI6NH0.NAXrHkH_clbbUalHrYDNCMZ7dK_PXAaNhHZlEtZKZkg',
                    text: 'user-4'
                }, {
                    value: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCIwIjoiaHR0cDpcL1wvbWFsbDIucHMiLCJhdWQiOiIiLCJpYXQiOjE2MTkwODIwOTMsIm5iZiI6MTYxOTExODA5MywidXNlcl9pZCI6NX0.cRCcNeQNn2q-3i3USh7JIDggGBcmoMOLcULjIOJc0Gc',
                    text: 'user-5'
                }]
            },
            param_page = {
                name: 'page',
                required: true,
                dataType: 'int',
                comment: '页码',
                default: '1'
            },
            param_page_size = {
                name: 'page_size',
                required: true,
                dataType: 'int',
                comment: '分页尺寸',
                default: '10'
            },
            param_id = {
                name: 'id',
                required: true,
                dataType: 'int',
                comment: 'ID',
                default: '1'
            },
            param_ids = {
                name: 'id',
                required: true,
                dataType: 'string',
                comment: '编号列表，以英文逗号隔开',
                default: '1,2,3'
            },
            param_is_debug = {
                name: 'is_debug',
                required: true,
                dataType: 'int',
                comment: '是否调试模式',
                default: '1',
                pickerData: [{
                    value: '1',
                    text: '是'
                }, {
                    value: '0',
                    text: '否'
                }, ]
            },
            param_timestamp = {
                name: 'timestamp',
                required: true,
                dataType: 'timestamp', // timestamp类型会出现刷新按钮
                comment: '时间戳',
                default: '{time}' // 变量替换，支持 {time},{microtime}
            },
            param_appid = {
                name: 'appid',
                required: true,
                dataType: 'string',
                comment: '应用唯一标识',
                default: 'test'
            },
            param_appkey = {
                name: 'appkey',
                required: true,
                dataType: 'string',
                comment: '应用签名密钥',
                default: 'a99AE2d2a736X65f5Ye63Ae299b0e339'
            },
            param_nonce = {
                name: 'nonce',
                required: true,
                dataType: 'string',
                comment: '随机生成的字符串',
                default: 'a20d6p'
            },
            param_sign = {
                name: 'sign',
                required: true,
                dataType: 'string',
                comment: '参数签名',
                default: '',
            };
        const project_example = {
            // 是否可用
            enable: true,
            // 项目名称
            title: '示例项目',
            // 项目别称（优先显示）
            alias: '示例',
            // 服务器基础地址配置
            servers: [{
                    text: '远程',
                    url: 'http://www.example.com'
                },
                {
                    text: '本地',
                    url: 'http://127.0.0.1:8080'
                },
            ],
            // 接口数据配置
            // 接口数据配置
            api_data: [
                // 示例接口
                {
                    title: '演示接口',
                    intro: '接口的描述内容',
                    created_at: '2020-12-31',
                    updated_at: new Date().toLocaleDateString(),
                    enable: true,
                    method: 'GET',
                    url: '/index.php/api/login',
                    querystringParams: [{
                            name: 'password',
                            required: true,
                            dataType: 'string',
                            inputType: 'password',
                            comment: '密码',
                            default: 'pwd123456'
                        },
                        param_timestamp,
                        {
                            name: 'gender',
                            required: true,
                            dataType: 'int',
                            comment: '性别',
                            default: '1',
                            pickerData: [{
                                value: '0',
                                text: '女'
                            }, {
                                value: '1',
                                text: '男'
                            }, {
                                value: '2',
                                text: '保密'
                            }],
                        }, {
                            name: 'extra',
                            required: true,
                            dataType: 'string',
                            inputType: 'textarea',
                            comment: '扩展数据',
                            default: '{k1:1, k2:"测试", k3:null}'
                        },
                    ],
                    bodyParams: [],
                    headersParams: [param_header_token],
                    result: {
                        success: '{status:1, msg:"", data:null, code:0}',
                        error: '{status:0, msg:"错误消息", data:null, code:0}',
                    }
                },
                // 支持目录功能
                {
                    title: '日志模块',
                    isFolder: true, // 是否目录
                    api_data: [
                        // 示例接口2
                        {
                            title: '更新日志',
                            intro: '',
                            created_at: new Date().toLocaleDateString(),
                            updated_at: new Date().toLocaleDateString(),
                            method: 'POST',
                            url: '/index.php/api/log/update',
                            querystringParams: [],
                            bodyParams: [
                                param_id, {
                                    name: 'content',
                                    required: true,
                                    dataType: 'string',
                                    inputType: 'textarea',
                                    comment: '日志描述',
                                    default: ''
                                },
                            ],
                            headersParams: [param_header_token],
                            result: {
                                success: '{status:1, msg:"", data:key字符串, code:0}',
                                error: '{status:1, msg:"错误消息", data:null, code:0}',
                            }
                        }, {
                            title: '查询日志详情',
                            intro: '',
                            method: 'POST',
                            url: '/index.php/api/log/read',
                            querystringParams: [],
                            bodyParams: [param_id],
                            headersParams: [param_header_token],
                            result: {
                                success: '{status:1, msg:"", data:key字符串, code:0}',
                                error: '{status:1, msg:"错误消息", data:null, code:0}',
                            }
                        }, {
                            title: '查询日志列表',
                            intro: '',
                            method: 'POST',
                            url: '/index.php/api/log/list',
                            querystringParams: [],
                            bodyParams: [param_page, param_page_size],
                            headersParams: [param_header_token],
                            result: {
                                success: '{status:1, msg:"", data:key字符串, code:0}',
                                error: '{status:1, msg:"错误消息", data:null, code:0}',
                            }
                        }, {
                            title: '删除日志列表',
                            intro: '',
                            method: 'DELETE',
                            url: '/index.php/api/log/delete',
                            querystringParams: [],
                            bodyParams: [param_ids, param_appid, param_appkey, param_timestamp, param_nonce, param_sign],
                            headersParams: [param_header_token],
                            signHandler: function (elTable) {
                                let params = {
                                    id: elTable.querySelector('input[name="id"]').value,
                                    appid: elTable.querySelector('input[name="appid"]').value,
                                    appkey: elTable.querySelector('input[name="appkey"]').value,
                                    timestamp: elTable.querySelector('input[name="timestamp"]').value,
                                    nonce: elTable.querySelector('input[name="nonce"]').value
                                }
                                // 按参数名称从小到大的顺序重新排列
                                let query = `appid=${params.appid}&appkey=${params.appkey}&id=${params.id}&nonce=${params.nonce}&timestamp=${params.timestamp}`;
                                // 用md5加密重新串联成请求字符串，截取中间16位作为签名
                                var sign = md5(query).substr(8, 16);
                                console.log('==签名', query, sign, md5(query));
                                elTable.querySelector('input[name="sign"]').value = sign;
                            },
                            result: {
                                success: '{status:1, msg:"", data:key字符串, code:0}',
                                error: '{status:1, msg:"错误消息", data:null, code:0}',
                            }
                        },
                    ]
                }
            ]
        };